package model

import (
	"fmt"
	"os"
	"path/filepath"

	"github.com/BurntSushi/toml"
)

// GetConfigLanguage 检查配置文件是否存在并返回语言设置
// 如果配置文件不存在或读取失败，返回默认语言 "en"
func GetConfigLanguage() string {
	configPath := "/etc/ssh-guardian/config.toml"

	// 检查配置文件是否存在
	if _, err := os.Stat(configPath); os.IsNotExist(err) {
		return "en" // 配置文件不存在，返回默认英文
	}

	// 尝试加载配置
	config, err := LoadConfig(configPath)
	if err != nil {
		return "en" // 配置文件读取失败，返回默认英文
	}

	// 返回配置文件中的语言设置
	return config.Logging.Language
}

// LoadConfig 加载并验证配置文件
func LoadConfig(path string) (*Config, error) {
	// 检查配置文件是否存在
	if _, err := os.Stat(path); os.IsNotExist(err) {
		GetLanguageManager().Error("配置文件不存在: ", "Configuration file does not exist: ", path)
		return nil, fmt.Errorf(GetLanguageManager().GetText())
	}

	// 读取配置文件
	data, err := os.ReadFile(path)
	if err != nil {
		GetLanguageManager().Error("读取配置文件失败: ", "Failed to read configuration file: ", err)
		return nil, fmt.Errorf(GetLanguageManager().GetText())
	}

	// 解析TOML
	var cfg Config
	if _, err = toml.Decode(string(data), &cfg); err != nil {
		GetLanguageManager().Error("解析配置文件失败: ", "Failed to parse configuration file: ", err)
		return nil, fmt.Errorf(GetLanguageManager().GetText())
	}

	// 执行配置验证
	if err = validateConfig(&cfg); err != nil {
		return nil, err
	}

	return &cfg, nil
}

// validateConfig 配置合法性校验
func validateConfig(cfg *Config) error {
	// 校验端口范围
	if cfg.Service.ListenPort < 1 || cfg.Service.ListenPort > 65535 {
		GetLanguageManager().Error("无效的端口号: ", "Invalid port number: ", cfg.Service.ListenPort)
		return fmt.Errorf(GetLanguageManager().GetText())
	}

	// 校验语言支持
	validLangs := map[string]bool{"en": true, "zh": true}
	if !validLangs[cfg.Logging.Language] {
		GetLanguageManager().Error("不支持的语言设置: ", "Unsupported language setting: ", cfg.Logging.Language)
		return fmt.Errorf("%s", GetLanguageManager().GetText())
	}

	// 校验路径是否为绝对路径
	if !filepath.IsAbs(cfg.Paths.Source) {
		GetLanguageManager().Error("源路径必须使用绝对路径: ", "Source path must be absolute: ", cfg.Paths.Source)
		return fmt.Errorf(GetLanguageManager().GetText())
	}
	if !filepath.IsAbs(cfg.Paths.BackupDir) {
		GetLanguageManager().Error("备份目录必须使用绝对路径: ", "Backup directory must be absolute: ", cfg.Paths.BackupDir)
		return fmt.Errorf(GetLanguageManager().GetText())
	}
	// 检查间隔时间是否为正整数
	if cfg.Service.Interval <= 0 {
		GetLanguageManager().Error("无效的间隔时间: ", "Invalid interval time: ", cfg.Service.Interval)
		return fmt.Errorf(GetLanguageManager().GetText())
	}
	return nil
}
